#pragma once
#include <iostream>
#include <pthread.h>
#include <string>

class Thread
{
public:
    typedef enum 
    {
        NEW = 0,
        RUNNING,
        EXIT
    }ThreadStatue;

    typedef void (*fun_t)(void*);
public:
    Thread(int num, fun_t func, void* args)
        :_tid(0)
        ,_func(func)
        ,_args(args)
        ,_statue(NEW)
    {
        std::string name = "thread-";
        name += std::string(std::to_string(num));
        _name = name;//线程的名字
    }

    pthread_t thread_id()//pthread_t 是一个无符号长整形
    {
        if(_statue == RUNNING)
            return _tid;
        else
            return 0;
    }

    //静态的成员函数不具有this
    // 但是会有新的问题：static成员函数，无法直接访问类属性和其他成员函数
    static void* handler(void* args)
    {
        Thread* td = (Thread*)args;

        (*td)();
        return nullptr;//先不关心返回值的问题
    }

    void operator()()
    {
        if(_func != nullptr)
            _func(_args);
    }
    void run()
    {
        int n = pthread_create(&_tid, nullptr, handler, this);
        if(n != 0) exit(-1);
        _statue = RUNNING;
    }

    std::string name()
    {
        return _name;
    }
    pthread_t join()
    {
        //成功返回0,失败返回错误码
        int n = pthread_join(_tid, nullptr);
        if(n != 0)
            return errno;
        _statue = EXIT;
        return 0;
    }

    int statue()
    {
        return _statue;
    }

    ~Thread()
    {}
private:
    pthread_t _tid;
    std::string _name;
    fun_t _func;//线程要执行的函数
    void* _args;//执行函数的参数
    ThreadStatue _statue;
};